home *** CD-ROM | disk | FTP | other *** search
- /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
- /* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is mozilla.org code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1998
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either of the GNU General Public License Version 2 or later (the "GPL"),
- * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
- /*
- * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- * NOTE!! This is not a general class, but specific to layout and frames.
- * Consumers looking for the general selection interface should look at
- * nsISelection.
- */
-
- #ifndef nsIFrameSelection_h___
- #define nsIFrameSelection_h___
-
- #include "nsISupports.h"
- #include "nsIFrame.h"
- #include "nsISelection.h"
- #include "nsIContent.h"
- #include "nsCOMPtr.h"
- #include "nsISelectionController.h"
-
- class nsIPresShell;
-
- // IID for the nsIFrameSelection interface
- #define NS_IFRAMESELECTION_IID \
- { 0x18477ed4, 0x01ff, 0x4319, \
- { 0x95, 0xc0, 0x63, 0x9e, 0xe4, 0x33, 0xbe, 0x92 } }
-
-
- //----------------------------------------------------------------------
-
- // Selection interface
-
- struct SelectionDetails
- {
- PRInt32 mStart;
- PRInt32 mEnd;
- SelectionType mType;
- SelectionDetails *mNext;
- };
-
- /*PeekOffsetStruct
- * @param mShell is used to get the PresContext usefull for measuring text ect.
- * @param mDesiredX is the "desired" location of the new caret
- * @param mAmount eWord, eCharacter, eLine
- * @param mDirection enum defined in this file to be eForward or eBackward
- * @param mStartOffset start offset to start the peek. 0 == beginning -1 = end
- * @param mResultContent content that actually is the next/previous
- * @param mResultOffset offset for result content
- * @param mResultFrame resulting frame for peeking
- * @param mEatingWS boolean to tell us the state of our search for Next/Prev
- * @param mPreferLeft true = prev line end, false = next line begin
- * @param mJumpLines if this is true then its ok to cross lines while peeking
- * @param mScrollViewStop if this is true then stop peeking across scroll view boundary
- */
- struct nsPeekOffsetStruct
- {
- void SetData(nsIPresShell *aShell,
- nscoord aDesiredX,
- nsSelectionAmount aAmount,
- nsDirection aDirection,
- PRInt32 aStartOffset,
- PRBool aEatingWS,
- PRBool aPreferLeft,
- PRBool aJumpLines,
- PRBool aScrollViewStop,
- PRBool aIsKeyboardSelect)
- {
- mShell=aShell;
- mDesiredX=aDesiredX;
- mAmount=aAmount;
- mDirection=aDirection;
- mStartOffset=aStartOffset;
- mEatingWS=aEatingWS;
- mPreferLeft=aPreferLeft;
- mJumpLines = aJumpLines;
- mScrollViewStop = aScrollViewStop;
- mIsKeyboardSelect = aIsKeyboardSelect;
- }
- nsIPresShell *mShell;
- nscoord mDesiredX;
- nsSelectionAmount mAmount;
- nsDirection mDirection;
- PRInt32 mStartOffset;
- nsCOMPtr<nsIContent> mResultContent;
- PRInt32 mContentOffset;
- PRInt32 mContentOffsetEnd;
- nsIFrame *mResultFrame;
- PRBool mEatingWS;
- PRBool mPreferLeft;
- PRBool mJumpLines;
- PRBool mScrollViewStop;
- PRBool mIsKeyboardSelect;
- };
-
- class nsIScrollableView;
-
-
- class nsIFrameSelection : public nsISupports {
- public:
- NS_DEFINE_STATIC_IID_ACCESSOR(NS_IFRAMESELECTION_IID)
- enum HINT { HINTLEFT = 0, HINTRIGHT = 1}; //end of this line or beginning of next
-
- /** Init will initialize the frame selector with the necessary pres shell to
- * be used by most of the methods
- * @param aShell is the parameter to be used for most of the other calls for callbacks ect
- * @param aLimiter limits the selection to nodes with aLimiter parents
- */
- NS_IMETHOD Init(nsIPresShell *aShell, nsIContent *aLimiter) = 0; //default since this isnt used for embedding
-
- /* SetScrollableView sets the scroll view
- * @param aScrollView is the scroll view for this selection.
- */
- NS_IMETHOD SetScrollableView(nsIScrollableView *aScrollView) =0;
-
- /* GetScrollableView gets the current scroll view
- * @param aScrollView is the scroll view for this selection.
- */
- NS_IMETHOD GetScrollableView(nsIScrollableView **aScrollView) =0;
-
- /** ShutDown will be called when the owner of the frame selection is shutting down
- * this should be the time to release all member variable interfaces. all methods
- * called after ShutDown should return NS_ERROR_FAILURE
- */
- NS_IMETHOD ShutDown() = 0;
-
- /** HandleKeyEvent will accept an event.
- * <P>DOES NOT ADDREF<P>
- * @param aGuiEvent is the event that should be dealt with by aFocusFrame
- * @param aFrame is the frame that MAY handle the event
- */
- NS_IMETHOD HandleTextEvent(nsGUIEvent *aGuiEvent) = 0;
-
- /** HandleKeyEvent will accept an event and a PresContext.
- * <P>DOES NOT ADDREF<P>
- * @param aGuiEvent is the event that should be dealt with by aFocusFrame
- * @param aFrame is the frame that MAY handle the event
- */
- NS_IMETHOD HandleKeyEvent(nsPresContext* aPresContext, nsGUIEvent *aGuiEvent) = 0;
-
- /** HandleClick will take the focus to the new frame at the new offset and
- * will either extend the selection from the old anchor, or replace the old anchor.
- * the old anchor and focus position may also be used to deselect things
- * @param aNewfocus is the content that wants the focus
- * @param aContentOffset is the content offset of the parent aNewFocus
- * @param aContentOffsetEnd is the content offset of the parent aNewFocus and is specified different
- * when you need to select to and include both start and end points
- * @param aContinueSelection is the flag that tells the selection to keep the old anchor point or not.
- * @param aMultipleSelection will tell the frame selector to replace /or not the old selection.
- * cannot coexist with aContinueSelection
- * @param aHint will tell the selection which direction geometrically to actually show the caret on.
- * 1 = end of this line 0 = beggining of this line
- */
- NS_IMETHOD HandleClick(nsIContent *aNewFocus, PRUint32 aContentOffset, PRUint32 aContentEndOffset ,
- PRBool aContinueSelection, PRBool aMultipleSelection, PRBool aHint) = 0;
-
- /** HandleDrag extends the selection to contain the frame closest to aPoint.
- * @param aPresContext is the context to use when figuring out what frame contains the point.
- * @param aFrame is the parent of all frames to use when searching for the closest frame to the point.
- * @param aPoint is relative to aFrame's parent view.
- */
- NS_IMETHOD HandleDrag(nsPresContext *aPresContext, nsIFrame *aFrame, nsPoint& aPoint) = 0;
-
- /** HandleTableSelection will set selection to a table, cell, etc
- * depending on information contained in aFlags
- * @param aParentContent is the paretent of either a table or cell that user clicked or dragged the mouse in
- * @param aContentOffset is the offset of the table or cell
- * @param aTarget indicates what to select (defined in nsISelectionPrivate.idl/nsISelectionPrivate.h):
- * TABLESELECTION_CELL We should select a cell (content points to the cell)
- * TABLESELECTION_ROW We should select a row (content points to any cell in row)
- * TABLESELECTION_COLUMN We should select a row (content points to any cell in column)
- * TABLESELECTION_TABLE We should select a table (content points to the table)
- * TABLESELECTION_ALLCELLS We should select all cells (content points to any cell in table)
- * @param aMouseEvent passed in so we we can get where event occured and what keys are pressed
- */
- NS_IMETHOD HandleTableSelection(nsIContent *aParentContent, PRInt32 aContentOffset, PRInt32 aTarget, nsMouseEvent *aMouseEvent) = 0;
-
- /** StartAutoScrollTimer is responsible for scrolling views so that aPoint is always
- * visible, and for selecting any frame that contains aPoint. The timer will also reset
- * itself to fire again if we have not scrolled to the end of the document.
- * @param aPresContext is the context to use when figuring out what frame contains the point.
- * @param aView is view to use when searching for the closest frame to the point,
- * which is the view that is capturing the mouse
- * @param aPoint is relative to the view.
- * @param aDelay is the timer's interval.
- */
- NS_IMETHOD StartAutoScrollTimer(nsPresContext *aPresContext, nsIView* aFrame, nsPoint& aPoint, PRUint32 aDelay) = 0;
-
- /** StopAutoScrollTimer stops any active auto scroll timer.
- */
- NS_IMETHOD StopAutoScrollTimer() = 0;
-
- /** EnableFrameNotification
- * mutch like start batching, except all dirty calls are ignored. no notifications will go
- * out until enableNotifications with a PR_TRUE is called
- */
- NS_IMETHOD EnableFrameNotification(PRBool aEnable) = 0;
-
- /** Lookup Selection
- * returns in frame coordinates the selection beginning and ending with the type of selection given
- * @param aContent is the content asking
- * @param aContentOffset is the starting content boundary
- * @param aContentLength is the length of the content piece asking
- * @param aReturnDetails linkedlist of return values for the selection.
- * @param aSlowCheck will check using slow method with no shortcuts
- */
- NS_IMETHOD LookUpSelection(nsIContent *aContent, PRInt32 aContentOffset, PRInt32 aContentLength,
- SelectionDetails **aReturnDetails, PRBool aSlowCheck) = 0;
-
- /** SetMouseDownState(PRBool);
- * sets the mouse state to aState for resons of drag state.
- * @param aState is the new state of mousedown
- */
- NS_IMETHOD SetMouseDownState(PRBool aState)=0;
-
- /** GetMouseDownState(PRBool *);
- * gets the mouse state to aState for resons of drag state.
- * @param aState will hold the state of mousedown
- */
- NS_IMETHOD GetMouseDownState(PRBool *aState)=0;
-
- /**
- if we are in table cell selection mode. aka ctrl click in table cell
- */
- NS_IMETHOD GetTableCellSelection(PRBool *aState)=0;
-
- /** GetSelection
- * no query interface for selection. must use this method now.
- * @param aSelectionType enum value defined in nsISelection for the seleciton you want.
- */
- NS_IMETHOD GetSelection(SelectionType aSelectionType, nsISelection **aSelection)=0;
-
- /**
- * ScrollSelectionIntoView scrolls a region of the selection,
- * so that it is visible in the scrolled view.
- *
- * @param aType the selection to scroll into view.
- * @param aRegion the region inside the selection to scroll into view.
- * @param aIsSynchronous when PR_TRUE, scrolls the selection into view
- * at some point after the method returns.request which is processed
- */
- NS_IMETHOD ScrollSelectionIntoView(SelectionType aSelectionType, SelectionRegion aRegion, PRBool aIsSynchronous)=0;
-
- /** RepaintSelection repaints the selected frames that are inside the selection
- * specified by aSelectionType.
- * @param aSelectionType enum value defined in nsISelection for the seleciton you want.
- */
- NS_IMETHOD RepaintSelection(nsPresContext* aPresContext, SelectionType aSelectionType)=0;
-
- /** GetFrameForNodeOffset given a node and its child offset, return the nsIFrame and
- * the offset into that frame.
- * @param aNode input parameter for the node to look at
- * @param aOffset offset into above node.
- * @param aReturnFrame will contain the return frame. MUST NOT BE NULL or will return error
- * @param aReturnOffset will contain offset into frame.
- */
- NS_IMETHOD GetFrameForNodeOffset(nsIContent *aNode, PRInt32 aOffset, HINT aHint, nsIFrame **aReturnFrame, PRInt32 *aReturnOffset)=0;
-
- /** AdjustOffsetsFromStyle. Called after detecting that a click or drag will
- * select the frame, this function looks for user-select style on that frame or a parent
- * frame, and adjust the content and offsets accordingly.
- * @param aFrame the frame that was clicked
- * @param outContent content node to be selected
- * @param outStartOffset selection start offset
- * @param outEndOffset selection end offset
- */
- NS_IMETHOD AdjustOffsetsFromStyle(nsIFrame *aFrame, PRBool *changeSelection,
- nsIContent** outContent, PRInt32* outStartOffset, PRInt32* outEndOffset)=0;
-
-
- NS_IMETHOD GetHint(HINT *aHint)=0;
- NS_IMETHOD SetHint(HINT aHint)=0;
-
- /** CharacterMove will generally be called from the nsiselectioncontroller implementations.
- * the effect being the selection will move one character left or right.
- * @param aForward move forward in document.
- * @param aExtend continue selection
- */
- NS_IMETHOD CharacterMove(PRBool aForward, PRBool aExtend)=0;
-
- /** WordMove will generally be called from the nsiselectioncontroller implementations.
- * the effect being the selection will move one word left or right.
- * @param aForward move forward in document.
- * @param aExtend continue selection
- */
- NS_IMETHOD WordMove(PRBool aForward, PRBool aExtend)=0;
-
- /** LineMove will generally be called from the nsiselectioncontroller implementations.
- * the effect being the selection will move one line up or down.
- * @param aForward move forward in document.
- * @param aExtend continue selection
- */
- NS_IMETHOD LineMove(PRBool aForward, PRBool aExtend)=0;
-
- /** IntraLineMove will generally be called from the nsiselectioncontroller implementations.
- * the effect being the selection will move to beginning or end of line
- * @param aForward move forward in document.
- * @param aExtend continue selection
- */
- NS_IMETHOD IntraLineMove(PRBool aForward, PRBool aExtend)=0;
-
- /**
- * Scrolling then moving caret placement code in common to text areas and
- * content areas should be located in the implementer
- * This method will accept the following parameters and perform the scroll
- * and caret movement. It remains for the caller to call the final
- * ScrollCaretIntoView if that called wants to be sure the caret is always
- * visible.
- *
- * @param aForward if PR_TRUE, scroll forward if not scroll backward
- *
- * @param aExtend if PR_TRUE, extend selection to the new point
- *
- * @param aScrollableView the view that needs the scrolling
- *
- * @param aFrameSel the nsIFrameSelection of the caller.
- *
- * @return always NS_OK
- */
- NS_IMETHOD CommonPageMove(PRBool aForward,
- PRBool aExtend,
- nsIScrollableView *aScrollableView,
- nsIFrameSelection *aFrameSel)=0;
-
- /** Select All will generally be called from the nsiselectioncontroller implementations.
- * it will select the whole doc
- */
- NS_IMETHOD SelectAll()=0;
-
- /** Sets/Gets The display selection enum.
- */
- NS_IMETHOD SetDisplaySelection(PRInt16 aState)=0;
- NS_IMETHOD GetDisplaySelection(PRInt16 *aState)=0;
-
- /** Allow applications to specify how we should place the caret
- * when the user clicks over an existing selection. A aDelay
- * value of PR_TRUE means delay clearing the selection and
- * placing the caret until MouseUp, when the user clicks over
- * an existing selection. This is especially usefull when applications
- * want to support Drag & Drop of the current selection. A value
- * of PR_FALSE means place the caret immediately. If the application
- * never calls this method, the nsIFrameSelection implementation
- * assumes the default value is PR_TRUE.
- * @param aDelay PR_TRUE if we should delay caret placement.
- */
- NS_IMETHOD SetDelayCaretOverExistingSelection(PRBool aDelay)=0;
-
- /** Get the current delay caret setting. If aDelay contains
- * a return value of PR_TRUE, the caret is placed on MouseUp
- * when clicking over an existing selection. If PR_FALSE,
- * the selection is cleared and caret is placed immediately
- * in all cases.
- * @param aDelay will contain the return value.
- */
- NS_IMETHOD GetDelayCaretOverExistingSelection(PRBool *aDelay)=0;
-
- /** If we are delaying caret placement til MouseUp (see
- * Set/GetDelayCaretOverExistingSelection()), this method
- * can be used to store the data received during the MouseDown
- * so that we can place the caret during the MouseUp event.
- * @aMouseEvent the event received by the selection MouseDown
- * handling method. A NULL value can be use to tell this method
- * that any data is storing is no longer valid.
- */
- NS_IMETHOD SetDelayedCaretData(nsMouseEvent *aMouseEvent)=0;
-
- /** Get the delayed MouseDown event data necessary to place the
- * caret during MouseUp processing.
- * @aMouseEvent will contain a pointer to the event received
- * by the selection during MouseDown processing. It can be NULL
- * if the data is no longer valid.
- */
- NS_IMETHOD GetDelayedCaretData(nsMouseEvent **aMouseEvent)=0;
-
-
- /** Get the content node that limits the selection
- * When searching up a nodes for parents, as in a text edit field
- * in an browser page, we must stop at this node else we reach into the
- * parent page, which is very bad!
- */
- NS_IMETHOD GetLimiter(nsIContent **aLimiterContent)=0;
-
- /** This will tell the frame selection that a double click has been pressed
- * so it can track abort future drags if inside the same selection
- * @aDoubleDown has the double click down happened
- */
- NS_IMETHOD SetMouseDoubleDown(PRBool aDoubleDown)=0;
-
- /** This will return whether the double down flag was set.
- * @aDoubleDown is the return boolean value
- */
- NS_IMETHOD GetMouseDoubleDown(PRBool *aDoubleDown)=0;
-
- /**
- * MaintainSelection will track the current selection as being "sticky".
- * Dragging or extending selection will never allow for a subset
- * (or the whole) of the maintained selection to become unselected.
- * Primary use: double click selecting then dragging on second click
- */
- NS_IMETHOD MaintainSelection()=0;
-
- #ifdef IBMBIDI
- /** GetPrevNextBidiLevels will return the frames and associated Bidi levels of the characters
- * logically before and after a (collapsed) selection.
- * @param aPresContext is the context to use
- * @param aNode is the node containing the selection
- * @param aContentOffset is the offset of the selection in the node
- * @param aPrevFrame will hold the frame of the character before the selection
- * @param aNextFrame will hold the frame of the character after the selection
- * @param aPrevLevel will hold the Bidi level of the character before the selection
- * @param aNextLevel will hold the Bidi level of the character after the selection
- *
- * At the beginning and end of each line there is assumed to be a frame with Bidi level equal to the
- * paragraph embedding level. In these cases aPrevFrame and aNextFrame respectively will return nsnull.
- */
- NS_IMETHOD GetPrevNextBidiLevels(nsPresContext *aPresContext, nsIContent *aNode, PRUint32 aContentOffset,
- nsIFrame **aPrevFrame, nsIFrame **aNextFrame, PRUint8 *aPrevLevel, PRUint8 *aNextLevel)=0;
-
- /** GetFrameFromLevel will scan in a given direction
- * until it finds a frame with a Bidi level less than or equal to a given level.
- * It will return the last frame before this.
- * @param aPresContext is the context to use
- * @param aFrameIn is the frame to start from
- * @param aDirection is the direction to scan
- * @param aBidiLevel is the level to search for
- * @param aFrameOut will hold the frame returned
- */
- NS_IMETHOD GetFrameFromLevel(nsPresContext *aPresContext, nsIFrame *aFrameIn, nsDirection aDirection, PRUint8 aBidiLevel,
- nsIFrame **aFrameOut)=0;
-
- #endif // IBMBIDI
- };
-
-
-
- #endif /* nsIFrameSelection_h___ */
-